<?php

Yii::import('application.modules.crm.models._base.BaseCuenta');

class Cuenta extends BaseCuenta {

    const TIPO_PROSPECTO = 'PROSPECTO';
    const TIPO_CLIENTE = 'CLIENTE';
    const ESTADO_ACTIVO = 'ACTIVO';
    const ESTADO_INACTIVO = 'INACTIVO';
    const PERMISOS_OWNER = 'OWNER';
    const PERMISOS_ALL = 'ALL';

    public $numCuentas;
    public $idGrupo;
    public $nombreGrupo;

    /**
     * @return Cuenta
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    public static function label($n = 1) {
        return Yii::t('app', 'Cuenta|Cuentas', $n);
    }

    public function searchParams() {
        return array(
            'nombre',
            'razon_social',
            'documento',
            'telefono',
            'industria_id',
            'tipo',
            'owner_id',
        );
    }

//    public function searchParamsCampania() {
//        return array(
//            'nombre',
//            'industria_id',
//            'tipo',
//        );
//    }

    public function rules() {
        return array_merge(parent::rules(), array(
            array('website', 'url'),
        ));
    }

    public function scopes() {

        return array(
            'activos' => array(
                'condition' => (Yii::app()->user->isSuperAdmin) ? 't.estado = :estado' : 't.estado = :estado and (t.permisos = :permisos or t.owner_id = :owner_id)',
                'params' => (Yii::app()->user->isSuperAdmin) ?
                        array(
                    ':estado' => self::ESTADO_ACTIVO,) : array(
                    ':estado' => self::ESTADO_ACTIVO,
                    ':permisos' => self::PERMISOS_ALL,
                    ':owner_id' => Yii::app()->user->id,
                        ),
            ),
            'ordenPorNombre' => array(
                'order' => 't.nombre ASC',
            ),
        );
    }

    public function relations() {
        return array_merge(parent::relations(), array(
            'grupos' => array(self::MANY_MANY, 'Grupo', 'grupo_cuenta(cuenta_id, grupo_id)'),
            'notas' => array(self::HAS_MANY, 'Nota', 'entidad_id', 'condition' => 'entidad_tipo = "cuenta"'),
            'oportunidades' => array(self::HAS_MANY, 'Oportunidad', 'cuenta_id'),
            'cobranzas' => array(self::HAS_MANY, 'Cobranza', 'cuenta_id'),
            'tareas' => array(self::HAS_MANY, 'Tarea', 'entidad_id', 'condition' => 'entidad_tipo = "cuenta"'),
            'eventos' => array(self::HAS_MANY, 'Evento', 'entidad_id', 'condition' => 'entidad_tipo = "cuenta"'),
            'incidencias' => array(self::HAS_MANY, 'Incidencia', 'entidad_id', 'condition' => 'entidad_tipo = "incidencia"'),
            'incidenciasAct' => array(self::HAS_MANY, 'Incidencia', 'cuenta_id'),
            //NUEVAS RELACIONES CON LAS NUEVAS TABLAS
            'direccionCuentas' => array(self::HAS_MANY, 'Direccion', 'entidad_id', 'condition' => 'entidad_tipo = "' . Crm_Constants::ENTIDAD_TIPO_CUENTA . '"'),
        ));
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
        return array_merge(parent::attributeLabels(), array(
            'razon_social' => Yii::t('app', 'Razón Social'),
            'documento' => Yii::t('app', 'Ruc'),
            'owner_id' => Yii::t('app', 'Usuario Responsable'),
            'permisos' => Yii::t('app', 'Visible para'),
            'usuario_creacion_id' => Yii::t('app', 'Usuario Creador'),
            'rating' => Yii::t('app', 'Calificación'),
        ));
    }

    public function getTipoOpciones() {
        return array(
            self::TIPO_PROSPECTO => Yii::t('app', 'Prospecto'),
            self::TIPO_CLIENTE => Yii::t('app', 'Cliente'),
        );
    }

    public function getPermisosOpciones() {
        return array(
            self::PERMISOS_OWNER => Yii::t('app', 'Usuario Responsable'),
            self::PERMISOS_ALL => Yii::t('app', 'Todos'),
        );
    }

    public function getTipoTexto() {
        $typeOptions = $this->tipoOpciones;
        return isset($typeOptions[$this->tipo]) ? $typeOptions[$this->tipo] : '';
    }

    /**
     * @author Alex Yepez <ayepez@tradesystem.com.ec>Cuenta
     * @return telefono principal de la cuenta
     */
    public function getTelefonoPrincipal() {
        $modelTelefono = Telefono::model()->findByAttributes(array(
            'entidad_id' => $this->id,
            'entidad_tipo' => "CUENTA",
            'principal' => 1
        ));
        if (!$modelTelefono) {
            $modelTelefono = Telefono::model()->findByAttributes(array(
                'entidad_id' => $this->id,
                'entidad_tipo' => "CUENTA",
            ));
        }
        if ($modelTelefono) {
            return $modelTelefono->numero;
        } else {
            return null;
        }
    }

    /**
     * @author Alex Yepez <ayepez@tradesystem.com.ec>Cuenta
     * @return telefono principal de la cuenta
     */
    public function getTelefonoTipo($tipo) {
        $modelTelefono = Telefono::model()->findByAttributes(array(
            'entidad_id' => $this->id,
            'entidad_tipo' => "CUENTA",
            'tipo' => $tipo,
            'principal' => 1
        ));
        if (!$modelTelefono) {
            $modelTelefono = Telefono::model()->findByAttributes(array(
                'entidad_id' => $this->id,
                'tipo' => $tipo,
                'entidad_tipo' => "CUENTA",
            ));
        }
        if ($modelTelefono) {
            return $modelTelefono->numero;
        } else {
            return null;
        }
    }

    /**
     * @author Alex Yepez <ayepez@tradesystem.com.ec>
     * @param type $tipo
     * @return direccion segun el tipo (entrega y facturaion)
     */
    public function getDireccion($tipo) {
        $modelDireccion = Direccion::model()->findByAttributes(array(
            'entidad_id' => $this->id,
            'entidad_tipo' => "CUENTA",
            $tipo => 1
        ));
        if ($modelDireccion) {
            return $modelDireccion->direccionGoogle;
        } else {
            return null;
        }
    }

    /**
     * Busqueda las cuentas por id que coincidan
     * @author Armando Maldonado
     * @param {Array} $param los id Cuenta
     * @return \CActiveDataProvider
     */
    public function searchByIdCuenta($param) {

        $criteria = new CDbCriteria;
        $criteria->addInCondition('id', $param);
        $criteria->compare('nombre', $this->nombre, true);
        $criteria->compare('website', $this->website, true);
        $criteria->compare('tipo', $this->tipo, true);
        $criteria->compare('empleados', $this->empleados);
        $criteria->compare('ingresos_anuales', $this->ingresos_anuales);
        $criteria->compare('descripcion', $this->descripcion, true);
        $criteria->compare('ultima_actividad', $this->ultima_actividad, true);
        $criteria->compare('rating', $this->rating);
        $criteria->compare('estado', $this->estado, true);
        $criteria->compare('usuario_creacion_id', $this->usuario_creacion_id);
        $criteria->compare('usuario_actualizacion_id', $this->usuario_actualizacion_id);
        $criteria->compare('fecha_creacion', $this->fecha_creacion, true);
        $criteria->compare('fecha_actualizacion', $this->fecha_actualizacion, true);
        $criteria->compare('industria_id', $this->industria_id);

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

    public function searchByGroup($param) {

        $criteria = new CDbCriteria;
        $criteria->with = array('industria');
        $criteria->join = 'LEFT JOIN cruge_user ON cruge_user.iduser = t.owner_id';
        $criteria->compare('t.nombre', $this->nombre, true, 'OR');
        $criteria->compare('t.razon_social', $this->razon_social, true, 'OR');
        $criteria->compare('t.documento', $this->documento, true, 'OR');
//        $criteria->compare('t.telefono', $this->telefono, true, 'OR');
        $criteria->compare('t.tipo', $this->tipo, true, 'OR');
        $criteria->compare('industria.nombre', $this->industria_id, true, 'OR');
        $criteria->compare('cruge_user.username', $this->owner_id, true, 'OR');
        $criteria->addInCondition('t.id', $param);

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

    /**
     * @autor Armando Maldonado <amaldonado@tradesystem.com.ec>
     * @return \CActiveDataProvider
     */
    public function search() {
        $criteria = new CDbCriteria;
        $sort = new CSort;
        $criteria->with = array('industria');
        $criteria->join = 'LEFT JOIN cruge_user ON cruge_user.iduser = t.owner_id';
        $criteria->compare('t.nombre', $this->nombre, true, 'OR');
        $criteria->compare('t.razon_social', $this->razon_social, true, 'OR');
        $criteria->compare('t.documento', $this->documento, true, 'OR');
//        $criteria->compare('t.telefono', $this->telefono, true, 'OR');
        $criteria->compare('t.tipo', $this->tipo, true, 'OR');
        $criteria->compare('industria.nombre', $this->industria_id, true, 'OR');
        $criteria->compare('cruge_user.username', $this->owner_id, true, 'OR');

        /* Sort criteria */

        $sort->attributes = array(
            'nombre' => array(
                'asc' => 't.nombre asc',
                'desc' => 't.nombre desc',
            ),
            '*',
        );
        $sort->defaultOrder = 't.nombre asc';

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria, 'sort' => $sort,
        ));
    }

    /**
     * Concatena los nombres de los grupos al que pertenece una cuenta.
     * @autor Armando Maldonado <amaldonado@tradesystem.com.ec>
     * @return string
     */
    public function gruposToString() {
        $return = '';
        foreach ($this->grupos as $grupo) {
            $return .='&nbsp;&nbsp;' . $grupo->nombre;
        }
        return $return;
    }

    /*
     * @autor Armando Maldonado <amaldonado@tradesystem.com.ec>
     */

    public function searchCuentaNoCampania($campania_id) {
        $criteria = new CDbCriteria;
        $sort = new CSort;
//        var_dump('entro');
        $criteria->with = array('industria');
        $criteria->compare('industria.nombre', $this->industria_id, true, 'OR');
        $criteria->compare('t.nombre', $this->nombre, true, 'OR');
        $criteria->compare('t.tipo', $this->tipo, true, 'OR');
        $criteria->addCondition('t.id not in (select cco.cuenta_id from campania_clientes_owner cco where cco.campania_id =:camapania_id)', 'AND');
        $criteria->addCondition('t.estado=:estado', 'AND');

        $criteria->group = 't.id';

        $Params = array(':camapania_id' => $campania_id, ':estado' => self::ESTADO_ACTIVO);
        $criteria->params = array_merge($criteria->params, $Params);

        /* Sort criteria */

        $sort->attributes = array(
            'nombre' => array(
                'asc' => 't.nombre asc',
                'desc' => 't.nombre desc',
            ),
            '*',
        );
        $sort->defaultOrder = 't.nombre asc';

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria, 'sort' => $sort,
        ));
    }

}
